#include <stdio.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <errno.h>
#include <sys/mman.h>

#include <arpa/inet.h>

#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <signal.h>

#include "headers/PanberryMain.h"
#include "headers/PanberryServer.h"


/**
 * main
 * @param argv количество параметров командной строки (считая имя программы)
 * @param argv массив строк-параметров командной строки
 */
int main(int argc, char *argv[])
{
	int cmdFd;
	
	if((cmdFd = open(CMD_FIFO, O_RDWR)) <= 0 ) {
        perror("open");
        return EXIT_FAILURE;
    }
	char buf[111] = "server";
    write(cmdFd, buf, 5);
kill(-1, SIGCHLD);
 
	
/*
	int i;
	int result;	
	int sockfd, request;
	int bytes_received;
	
	char received_data[RECEIVED_DATA_MAXLEN];
	char ip[INET_ADDRSTRLEN];

	struct addrinfo hints;
    struct addrinfo *list;
	
    struct sockaddr local, remote;
	int local_len, remote_len = sizeof(remote);

	struct sockaddr_in *remote_in;

	errno = 0;

    // наличие двух аргументов обязательно
    if (argc < 2) {
        fprintf(stderr, "Not enough arguments\n");
        return EXIT_FAILURE;
    }

	// -------------------------------------------------------------
	// критерии отбора для функции getaddrinfo
    hints.ai_flags = 0;
    hints.ai_family = AF_INET;
    hints.ai_socktype = 0;
    hints.ai_protocol = 0;
    hints.ai_addrlen = 0;
    hints.ai_addr = NULL;
    hints.ai_canonname = NULL;
    hints.ai_next = NULL;

	// получение адреса удалённого сокета
	if ((result = getaddrinfo(argv[1], argv[2], &hints, &list)) != 0) {
    	fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(result));
       	return EXIT_FAILURE;
	}
	local = *(list->ai_addr);	
	local_len = sizeof(local);
	// очищение памяти
    freeaddrinfo(list);

	// -------------------------------------------------------------
	// создание сокета
	if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
		perror("socket");
		return EXIT_FAILURE;
	}

	// присваивание сокету локального адреса
	if (bind(sockfd, &local, local_len) == -1) {
		perror("bind");
		return EXIT_FAILURE;
	}

	// выразить готовность принимать входящие соединени     
	if (listen(sockfd, BACKLOG) == -1) {
		perror("listen");
		return EXIT_FAILURE;
	}

	// -------------------------------------------------------------	
	//while(1) {
		// извлечение первого запроса на соединение из очереди ожидающих соединений
		if ((request = accept(sockfd, NULL, 0)) == -1) {
			perror ("accept");
		
			return EXIT_FAILURE;
		}

		printf("hello\n");

		



		

		// закрытие запроса
		if (close(request) != 0) {
			perror("close");
			return EXIT_FAILURE;
		}
	//}

	// -------------------------------------------------------------
	// закрытие сокета
	if (close(sockfd) != 0) {
		perror("close");
		return EXIT_FAILURE;
    }*/

	return EXIT_SUCCESS;
}
